package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe UsuarioDAO, extende a classe DAOGenerico para obeter 
 * recursos de conexão e excução de consultas e comandos.
 * 
 * Responsável por gerenciar acesso ao banco de dados relacionados a 
 * Entidade Usuario.
 * 
 * @author Daniel
 * 
 */
public class UsuarioDAO extends DAOGenerico {
    
    /**
     * Método para inserir um usuario.
     * 
     * @param usuario Objeto usuario a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     * 
     **/
    
    public boolean inserir(Usuario usuario){
        
        usuario.setId(getNextId("usuarios"));
     
        return executarComando("INSERT INTO usuarios (id, nome, login, senha) VALUES (?,?,?,?)"
                               , usuario.getId(), usuario.getNome(), usuario.getLogin(), usuario.getSenha());
        
    }
    
    /**
     * Método para atualizar informações de um usuario.
     * 
     * @param usuario Objeto usuario a ser atualizado.
     * 
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean atualizar(Usuario usuario){
     
        return executarComando("UPDATE usuarios SET nome = ?, login = ?, senha = ? WHERE id = ?"
                             , usuario.getNome(), usuario.getLogin(), usuario.getSenha(),usuario.getId());
        
    }
    
    /**
     * Método para excluir um usuario.
     * 
     * @param usuario Objeto usuario a ser excluído.
     * 
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(Usuario usuario){
    
        return executarComando("DELETE FROM usuarios WHERE id = ?", usuario.getId());
        
    }
    
    /**
     * Método para excluir um usuario.
     * 
     * @param id ID do objeto a ser excluído
     * 
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(int id){
    
        return executarComando("DELETE FROM usuarios WHERE id = ?", id);
        
    }
    
    public boolean login(String login, String senha){
    
        boolean result = false;
        
        ResultSet rs = executarConsulta("SELECT * FROM usuarios WHERE login = ? AND senha = ?", login, senha);
        
        try {
            
            if(rs.next()){
                
                result = true;
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO BUSCAR USUARIO POR ID");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
        
        return result;
        
    }
    
    /**
     * Método para buscar o usuario pelo ID
     * 
     * @return Usuario correspondente ai ID, se não for encontrado retorna null.
     * 
     * @param id inteiro que representa o ID do usuario na tabela
     * 
     **/
    
    public Usuario getById(int id){
    
        ResultSet rs = executarConsulta("SELECT * FROM usuarios WHERE id = ?", id);
        
        Usuario usuario = null;
        
        try {
            
            if(rs.next()){
                
                usuario = polularInformacoes(rs);
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO BUSCAR USUARIO POR ID");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
        
        return usuario;
        
    }
    
    /**
     * Método para listagem de usuarios.
     * 
     * @return Retorna uma lista de usuarios com o resultado da consulta
     * 
     **/
    
    public List<Usuario> listar(){
    
        List<Usuario> usuarios = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM usuarios ORDER BY id");
        
        try {
            
            while(rs.next()){
                
                usuarios.add(polularInformacoes(rs));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return usuarios;
        
    }
    
    /**
     * Método para pesquisar convênios por nome.
     * 
     * Retorna um ResultSet com os resultados
     * 
     * @param nome Variável para pesquisa
     * 
     **/
    
    public List<Usuario> listar(String nome){
    
        List<Usuario> usuarios = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM usuarios "
                                      + "WHERE UPPER(nome) LIKE ? "
                                      + "ORDER BY id", "%"+nome.toUpperCase()+"%");
        
        try {
            
            while(rs.next()){
                
                usuarios.add(polularInformacoes(rs));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return usuarios;
        
    }
    
    //public List<Usuario> 
    
    /**
     * Método para preencher informações de um usuario com resultados do 
     * banco de dados.
     * 
     * @param rs ResultSet com o resultado de uma consulta SQL
     * 
     * @return Retorna um usuario populado com informações vindas do banco de 
     *  dados
     * 
     **/
    
    public Usuario polularInformacoes(ResultSet rs){
    
        Usuario usuario = new Usuario();
        
        try {
            
            usuario.setId(rs.getInt("id"));
            usuario.setNome(rs.getString("nome"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PULULAR USUARIO");
            
        }
        
        return usuario;
        
    }
    
}
